package main

import (
	"fmt"
	"time"
)

func main() {

	// 定义两个 channel
	messages := make(chan int, 10)
	done := make(chan bool)

	// channel message 一定会被关闭
	defer close(messages)

	// consumer
	go func() {

		// 定义一个定时器，定时器的时钟频率是 1s
		ticker := time.NewTicker(1 * time.Second)

		// for 循环 "遍历" 定时器，意味着 for 循环里面的代码每 1s 执行一次
		for _ = range ticker.C {
			select {
				// for 循环的退出时由 done 这个 channel 控制的，如果 done 这个 channel 中读到数据了，就退出
				case <-done:
					fmt.Println("child process interrupt...")
					return
				default:
					// 每次循环都会试图从 message 这个 channel 中读取数据
					fmt.Printf("send message: %d\n", <-messages)
			}
		}
	}()

	// 主线程作为 producer 想 message 这个 channel 中写数据
	for i := 0; i < 10; i++ {
		messages <- i
	}

	// 主线程 5s 后向 done 这个 channel 发送消息，旨在终止协程中的 for 循环
	time.Sleep(5 * time.Second)
	close(done)

	// 主线程在协程终止后等 1s 后退出
	time.Sleep(1 * time.Second)
	fmt.Println("main process exit!")
}
